package com.hope.reflection.question;

import java.lang.reflect.Constructor;

/**
 * 通过反射机制创建实例
 */
public class ReflecCreateInstance {
    public static void main(String[] args) throws Exception {
        //1. 先获取到User类到Class对象
        Class<?> userClass = Class.forName("com.hope.reflection.question.User");
        //2. 通过public的无参构造器创造实例
        Object objects = userClass.getConstructor().newInstance();
        System.out.println(objects);
        //3. 通过public的有参构造器创造实例
        //   constructor对象就是
        //   public User(String name) {  //public 有参构造器
        //        this.name = name;
        //    }
        //   先得到对应构造器，再创建实例，并传入实参
        Constructor<?> constructor = userClass.getConstructor(String.class);
        Object cjh = constructor.newInstance("cjh");
        System.out.println("cjh="+cjh);
        //4. 通过非public的有参构造器创造实例
        //   getDeclaredConstructor 可以返回所有的构造器对象
        //   先得到private的构造器对象
        Constructor<?> declaredConstructor = userClass.getDeclaredConstructor(int.class, String.class);
        declaredConstructor.setAccessible(true);//爆破[暴力破解] 使用反射可以访问私有的构造器/方法/属性 ，反射面前都是纸老虎
        Object user2 = declaredConstructor.newInstance(100, "菜菜");
        System.out.println(user2);
    }
}

class User {
    private int age=10;
    private String name="蔡江鸿";

    private User(int age, String name) {  //private 有参构造器
        this.age = age;
        this.name = name;
    }

    public User(String name) {  //public 有参构造器
        this.name = name;
    }

    public User() { //无参 public
    }

    @Override
    public String toString() {
        return "User[age=" + age + ", name=" + name + "]";
    }
}